﻿using System;
using System.Collections.Generic;
using System.Windows.Forms;
using BadgeManager.Controller;
using BadgeManager.Model;

namespace Badge_Manager.View
{
    public partial class frmAttivita : Form
    {
        private Utente User;
        private StatoForm status;
        private Attivita attivita;
        private List<Corso> listaCorsi;
        private List<Stanza> listaAule;
        private static frmAttivita session;
        private frmElencoAttivita elenco;

        public static frmAttivita Istance(Utente utente, StatoForm stato, Attivita attivita, frmElencoAttivita elenco)
        {
            if (session == null)
                session = new frmAttivita(utente, stato, attivita, elenco);
            return session;
        }

        public frmAttivita(Utente utente, StatoForm stato, Attivita attivita, frmElencoAttivita elenco)
        {
            InitializeComponent();
            User = utente;
            status = stato;
            this.attivita = attivita;
            ControllaPermessi();
            getAule();
            CambiaStato(status);
            this.elenco = elenco;
        }

        private void CambiaStato(StatoForm stato)
        {
            switch (stato)
            {
                case StatoForm.Modifica:
                    this.Text += " [Modifica]";
                    ImpostaComboModalitàModifica();
                    cmbElencoCorsi.Enabled = false;
                    if (attivita.SenzaFine)
                    {
                        optAttIndet.Checked = true;
                        optAttDeterminata.Enabled = false;
                    }
                    else
                    {
                        optAttIndet.Enabled = false;
                    }
                    break;
                case StatoForm.Nuovo:
                    this.Text += " [Nuovo]";
                    ImpostaComboCorsi();
                    break;
                case StatoForm.Lettura:
                    this.Text += " [Lettura]";
                    break;
            }
        }

        private void ImpostaComboModalitàModifica()
        {
            if (attivita != null)
            {
                txtDescrizioneAttivita.Text = attivita.Descrizione.ToString();
                cmbElencoAule.SelectedItem = attivita.Stanza;
                if (attivita.Corso != null)
                {
                    cmbElencoCorsi.Items.Add(attivita.Corso);
                    cmbElencoCorsi.SelectedItem = attivita.Corso;
                }
                else
                {
                    cmbElencoCorsi.Items.Add(attivita);
                    cmbElencoCorsi.SelectedItem = attivita;
                }
            }
        }

        private void Pulisci()
        {
            foreach (Control ctrl in groupBox1.Controls)
            {
                if (ctrl is TextBox)
                    ctrl.Text = "";
            }
        }

        private void ImpostaComboCorsi()
        {
            listaCorsi =
                new ctrlCorso().SelectAllSenzaAttività();
            if (listaCorsi.Count > 0)
            {
                cmbElencoCorsi.DataSource = null;
                cmbElencoCorsi.DataSource = listaCorsi;
                if (cmbElencoCorsi.Items.Count > 0)
                    cmbElencoCorsi.SelectedIndex = 0;
            }
            else
            {
                MessageBox.Show("Non ci sono Corsi! E' possibile creare solo un attività a tempo indeterminato", "Informazione", MessageBoxButtons.OK, MessageBoxIcon.Information);
                cmbElencoCorsi.Enabled = false;
                optAttDeterminata.Enabled = false;
                optAttIndet.Checked = true;
                optAttIndet.Enabled = false;
            }
        }

        public void AggiornaCorsiDaEsterno()
        {
            ImpostaComboCorsi();
        }

        private void getAule()
        {
            listaAule =
                new ctrlStanza().SelectAll();
            cmbElencoAule.DataSource = listaAule;
            if (cmbElencoAule.Items.Count > 0)
                cmbElencoAule.SelectedIndex = 0;
        }

        private void ControllaPermessi()
        {
            if (User != null)
            {
                ctrlUtente cUtente = new ctrlUtente();
                if (!cUtente.PuoModificare(User) ||
                    !cUtente.PuoScrivere(User))
                {
                    cmdSalva.Enabled = false;
                }
            }
        }

        private void Salva()
        {
            DialogResult result = System.Windows.Forms.DialogResult.No;
            AttivitaEsistente tipologia = AttivitaEsistente.NonEsistente;
            if ((cmbElencoCorsi.Items.Count > 0
                && cmbElencoAule.Items.Count > 0) || optAttIndet.Checked == true)
            {
                if (status == StatoForm.Nuovo)
                    attivita = new Attivita();
                attivita.Corso = (Corso)cmbElencoCorsi.SelectedItem;
                attivita.Descrizione = txtDescrizioneAttivita.Text;
                attivita.SenzaFine = optAttIndet.Checked;
                // Controlla se la stanza è differente a quella precedentemente assegnata
                if (status == StatoForm.Nuovo ||
                    attivita.Stanza.Numero != ((Stanza)cmbElencoAule.SelectedValue).Numero)
                {
                    ctrlAttivita cAttivita = new ctrlAttivita(null);
                    // controllo se esiste un'attivita presente all'interno della data Aula
                    tipologia = cAttivita.VerificaAttivitaEsistente(((Stanza)cmbElencoAule.SelectedValue).Numero);
                    // Se esiste ed è ancora in corso
                    if (tipologia == AttivitaEsistente.Esistente)
                    {
                        if (cAttivita.VerificaPossibilitàInserimento(((Stanza)cmbElencoAule.SelectedItem).Numero,
                            ((Corso)cmbElencoCorsi.SelectedItem)))
                        {
                            result = System.Windows.Forms.DialogResult.Yes;
                        }
                        else
                        {
                            MessageBox.Show(@"Impossibile inserire. L'inizio del corso selezionato va in confilitto con il corso presente nella stessa aula.",
                                "Attenzione", MessageBoxButtons.OK, MessageBoxIcon.Stop);
                            return;
                        }
                    }
                    // se esiste ma è finita avvisa altrimenti se non esiste affatto continua
                    else if (tipologia == AttivitaEsistente.AttivitaFinita)
                    {
                        result = MessageBox.Show("Attività Finita riutilizzare l'Aula ?",
                            "Attenzione", MessageBoxButtons.YesNo, MessageBoxIcon.Information);
                    }
                    // se è a tempo indeterminato, avvisa!!
                    else if (tipologia == AttivitaEsistente.TempoIndeterminato && optAttIndet.Checked == false)
                    {
                        result = MessageBox.Show("All'interno di quest aula si svolge un Attività a tempo Indeterminato, continuare comunque ?",
                             "Attenzione", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
                    }
                }
                attivita.Stanza = (Stanza)cmbElencoAule.SelectedItem;
                if (status == StatoForm.Nuovo && optAttIndet.Checked && new ctrlAttivita(null).ControlloEsistenzaAttivitàIndeterminata(attivita.Stanza.Numero))
                {
                    MessageBox.Show("Esiste già un'attività a tempo Indeterminato in quest'aula",
                     "Attenzione", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }
                if (result == System.Windows.Forms.DialogResult.Yes || tipologia == AttivitaEsistente.NonEsistente
                    || (optAttIndet.Checked == true && result == System.Windows.Forms.DialogResult.Yes))
                {
                    if (optAttIndet.Checked || optAttDeterminata.Checked == false)
                    {
                        ctrlAttivita cAttivita = new ctrlAttivita(attivita);
                        if (status == StatoForm.Nuovo)
                        {
                            attivita.Id = Guid.NewGuid();
                            cAttivita.Inserisci();
                        }
                        else
                            cAttivita.Update();
                        frmAggiungiAlunni frm = new frmAggiungiAlunni(User, StatoForm.Modifica, attivita);
                        frm.Left = 20;
                        frm.Top = 20;
                        frm.MdiParent = this.MdiParent;
                        frm.Show();
                        frm.Focus();
                    }
                    else
                    {
                        if (optAttDeterminata.Checked)
                        {
                            frmAttivitaDett frm;
                            if (status == StatoForm.Modifica)
                                frm = new frmAttivitaDett(User, attivita, status, elenco);
                            else
                                frm = new frmAttivitaDett(User, attivita, status, null);
                            frm.MdiParent = this.MdiParent;
                            frm.Left = 20;
                            frm.Top = 20;
                            frm.Show();
                        }
                    }

                    this.Close();
                    this.Pulisci();
                }
            }
            else
            {
                MessageBox.Show("Non hai elementi sufficienti per inserire l'attività");
            }
        }

        private void cmdSalva_Click(object sender, System.EventArgs e)
        {
            this.Salva();
        }

        private void cmdAnnulla_Click(object sender, System.EventArgs e)
        {
            this.Close();
        }

        private void cmdAggCorso_Click(object sender, EventArgs e)
        {
            frmAggiungiCorso frm = new frmAggiungiCorso(User, null, StatoForm.Nuovo);
            frm.MdiParent = this.MdiParent;
            frm.Show();
        }

        private void cmdAggAula_Click(object sender, EventArgs e)
        {
            frmAule frm = new frmAule(User, StatoForm.Nuovo);
            frm.MdiParent = this.MdiParent;
            frm.Show();
        }

        private void optAttIndet_CheckedChanged(object sender, EventArgs e)
        {
            txtDescrizioneAttivita.Text = "Tempo Indeterminato";
            cmbElencoCorsi.Enabled = false;
            cmbElencoCorsi.DataSource = null;
        }

        private void optAttDettaglio_CheckedChanged(object sender, EventArgs e)
        {
            txtDescrizioneAttivita.Clear();
            cmbElencoCorsi.Enabled = true;
            ImpostaComboCorsi();
        }
    }
}